package top.goldenyear.porpoise.common.core.util.object;

import cn.hutool.v7.core.reflect.FieldUtil;
import cn.hutool.v7.core.util.ObjUtil;

import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.function.Consumer;

/**
 * Object 工具类
 *
 * @author Airhead
 */
public class ObjUtils extends ObjUtil {

  /**
   * 复制对象，并忽略 Id 编号
   *
   * @param object   被复制对象
   * @param consumer 消费者，可以二次编辑被复制对象
   * @return 复制后的对象
   */
  public static <T> T cloneIgnoreId(T object, Consumer<T> consumer) {
    T result = ObjUtil.clone(object);
    // 忽略 id 编号
    Field field = FieldUtil.getField(object.getClass(), "id");
    if (field != null) {
      FieldUtil.setFieldValue(result, field, null);
    }
    // 二次编辑
    if (result != null) {
      consumer.accept(result);
    }
    return result;
  }

  public static <T extends Comparable<T>> T max(T obj1, T obj2) {
    if (obj1 == null) {
      return obj2;
    }
    if (obj2 == null) {
      return obj1;
    }
    return obj1.compareTo(obj2) > 0 ? obj1 : obj2;
  }

  @SafeVarargs
  public static <T> T defaultIfNull(T... array) {
    for (T item : array) {
      if (item != null) {
        return item;
      }
    }
    return null;
  }

  @SafeVarargs
  public static <T> boolean equalsAny(T obj, T... array) {
    return Arrays.asList(array).contains(obj);
  }
}
